!pip install opencv-python
import cv2
from IPython.display import Image
net=cv2.dnn.readNet('yolov3.weights','yolov3.cfg')
net
with open('coco.names') as f:
classes=f.read().split('\n')
print(classes)
img=cv2.imread('photo2.jpg')
h,w,d=img.shape
print(h,w,d)
blob=cv2.dnn.blobFromImage(img, 1/255, (608,608), (0,0,0), swapRB=True, crop=False)
net.setInput(blob)
layer_names=net.getLayerNames()
out_layers_index=net.getUnconnectedOutLayers()
out_layers=[layer_names[index[0]-1] for index in out_layers_index]
out_layers
outs=net.forward(out_layers)
#for out in outs:
# for obj in out:
# print(obj)
def draw_obj(img,index,score,box):
x,y,w,h=box
start=(x,y)
end=(x+w,y+h)
color=(0,255,0)
width=2
img=cv2.rectangle(img,start,end,color,width)
start=(x-10,y-10)
font_size=1
font = cv2.FONT_HERSHEY_SIMPLEX
color = (0, 255, 0)
width=2
text=classes[index]
img = cv2.putText(img, text, start, font, font_size, color, width, cv2.LINE_AA)
return img
class_indexes=[]
class_scores=[]
boxes=[]
import numpy as np
for out in outs:
for obj in out:
scores=obj[5:]
class_index=np.argmax(scores)
class_score=scores[class_index]
if class_score >0:
centr_x=int(obj[0]*w)
centr_y=int(obj[1]*h) #получаем координаты начала объекта
obj_w=int(obj[2]*w)#ширина объекта
obj_h=int(obj[3]*h)#высота объекта
x=centr_x-obj_w//2
y=centr_y-obj_h//2
box=[x,y,obj_w,obj_h]
boxes.append(box)
class_indexes.append(class_index)
class_scores.append(float(class_score))
chosen_boxes=cv2.dnn.NMSBoxes(boxes,class_scores, 0,0.4)
for box_index in chosen_boxes:
box_index=box_index[0]
img=draw_obj(img,class_indexes[box_index],class_scores[box_index],boxes[box_index])
cv2.imwrite('Photo_2.jpg',img)
Image('Photo_2.jpg')